package cn.geekyspace.scanhive.utils;

import cn.geekyspace.scanhive.pojo.entity.CleaningData;
import javafx.animation.FadeTransition;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.paint.Color;
import javafx.util.Duration;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.regex.Pattern;

/**
 * UI更新器
 */
@Data
@Component
public class UIUpdater {

    // 左下角日志
    private Label logLabel;
    // 扫码状态（OK/NG）
    private Label scanStatus;
    // 扫码文本框
    private TextArea scanText;
    // 自动入库勾选
    private CheckBox autoStorage;

    // 扫码计数
    public Label scanCount;
    // 扫码记录表格
    public TableView<CleaningData> scanRecordTable;
    private static int idCounter = 0;                                                                        // 静态计数器，动态维护 ID
    private static final ObservableList<CleaningData> scanRecordList = FXCollections.observableArrayList();  // 扫码记录列表（TODO：有性能瓶颈后再限制条数）

    // 用于记录是否需要等待测试结果
    private boolean waitingForTestResult = false;
    // 记录上次入库待处理的数据
    private CleaningData lastWaitingForTestResultData = null;

    /**
     * 设置日志信息
     */
    public void setLogMessage(String message) {
        setLogMessage(message, Color.BLACK);
    }

    public void setLogMessage(String message, Color color) {
        Platform.runLater(() -> {
            logLabel.setText(message);
            logLabel.setTextFill(color);
        });
    }


    /**
     * OK/NG 状态更新
     */
    public void updateScanStatusLabel(boolean status) {
        // 确保在 JavaFX 应用线程中更新 UI 元素
        Platform.runLater(() -> {
            String currentStyle = scanStatus.getStyle();  // 获取当前样式
            String backgroundColor = status ? "green" : "red";  // 根据状态设置颜色

            // 仅更新背景颜色
            String newStyle = currentStyle.replaceAll("(?<=-fx-background-color:)[^;]*", backgroundColor);
            scanStatus.setText(status ? "OK" : "NG");
            scanStatus.setStyle(newStyle);  // 应用新的样式
        });
    }

    /**
     * 检查扫码状态（只有特定格式的文本返回true）
     * @param scannedData 扫码文本数据
     */
    public boolean checkScanStatus(String scannedData) {
        // 已知 OK 数据
        // CTLRR-220prO-P01-A1;CTLRR-220pr0-P01-A1-BT;2024-12-16;SB180S2412002;T0.10/0.07/0.12mm/0.5pitch
        // CTLRR-220pro-P01-A1;CTLRR-220pro-P01-A1-BT;2024-12-16;SB180S2412002
        // PLCCTMRR-130Pro-P01-A2;CTMRR-130Pro-P01-A2-TOP;2024-07-16;SB180S2407001;T0.10mm/0.5pitch
        if (scannedData == null || scannedData.isEmpty()) {
            return false; // 数据为空
        }

        // 检查是否包含至少 3 个分号
        long semicolonCount = scannedData.chars().filter(ch -> ch == ';').count();
        if (semicolonCount < 3) {
            return false; // 分号数量不足
        }

        // 按分号分隔符拆分数据
        String[] parts = scannedData.split(";");

        // 确保至少有 4 段数据
        if (parts.length < 4) {
            return false; // 数据段不足
        }

        // 检查第 3 段是否是日期格式
        String datePart = parts[2]; // 日期在第 3 段
        if (!Pattern.matches("\\d{4}-\\d{2}-\\d{2}", datePart)) {
            return false; // 日期格式不正确
        }

        // 检查通过
        return true;
    }

    /**
     * 更新扫码文本框内容（淡入动画效果）
     */
    public void updateScanText(String text) {
        Platform.runLater(() -> {
            scanText.clear();  // 清空文本框
            scanText.appendText(text);  // 设置新文本

            // 创建并播放淡入动画效果
            FadeTransition fadeIn = new FadeTransition(Duration.seconds(1), scanText);
            fadeIn.setFromValue(0);
            fadeIn.setToValue(1);
            fadeIn.setCycleCount(1);
            fadeIn.setAutoReverse(false);
            fadeIn.play();  // 开始动画
        });
    }


    public void setScanRecordAndInitTableData(TableView<CleaningData> scanRecordTable) {
        this.scanRecordTable = scanRecordTable;
        scanRecordTable.setItems(scanRecordList);
    }

    /**
     * 添加一条扫码记录
     */
    public void addScanRecord(CleaningData cleaningData) {
        if (cleaningData != null) {
            waitingForTestResult = true;                   // 例如设置为 true 表示正在等待测试结果
            lastWaitingForTestResultData = CleaningData.builder()
                    .id(cleaningData.getId())
                    .qrCode(cleaningData.getQrCode())
                    .qrCodeScanTime(cleaningData.getQrCodeScanTime())
                    .build();

            idCounter += 1;
            cleaningData.setId(idCounter); // 动态设置 ID
            Platform.runLater(() -> scanCount.setText(String.valueOf(idCounter)));
            scanRecordList.add(0, cleaningData); // 添加记录到列表
        }
    }

    /**
     * 更新回传数据
     */
    public void receivePlcDataAndUpdate(CleaningData cleaningData) {
        if (cleaningData != null) {
            CleaningData firstRecord = scanRecordList.get(0);
            firstRecord.setCleaningDuration(cleaningData.getCleaningDuration());
            firstRecord.setCleaningTemperature(cleaningData.getCleaningTemperature());
            firstRecord.setRinsingDuration(cleaningData.getRinsingDuration());
            firstRecord.setRinsingTemperature(cleaningData.getRinsingTemperature());
            firstRecord.setDryingDuration(cleaningData.getDryingDuration());
            firstRecord.setDryingTemperature(cleaningData.getDryingTemperature());
            firstRecord.setPlcDataReturnTime(cleaningData.getPlcDataReturnTime());
            scanRecordList.set(0, firstRecord);

            waitingForTestResult = false;
            lastWaitingForTestResultData = null;
        }
    }

    /**
     * 清空扫码记录
     */
    public void clearScanRecords() {
        idCounter = 0;                                  // 重置 ID 计数器
        Platform.runLater(() -> scanCount.setText(String.valueOf(idCounter)));
        scanRecordList.clear();                         // 清空列表
        waitingForTestResult = false;
        lastWaitingForTestResultData = null;
        setLogMessage("完成重置！");
    }

}
